﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace LGPeWJNM.BaseClasses
{
    /// <summary>
    /// Um cliente, caracterizado por sua posição e demanda
    /// </summary>
    public interface ICliente
    {
        /// <summary>
        /// demanda do cliente
        /// </summary>
        int Demanda { get; set; }

        /// <summary>
        /// coordenada do cliente
        /// </summary>
        Point Coordenada { get; set; }
    }

    /// <summary>
    /// Um cliente, caracterizado por sua posição e demanda
    /// </summary>
    public class Cliente : ICliente, IEquatable<Cliente>
    {
        /// <summary>
        /// demanda do cliente em unidades inteiras
        /// </summary>
        [System.Xml.Serialization.XmlAttribute]
        public int Demanda { get; set; }

        /// <summary>
        /// coordenada do cliente num plano cartesiano
        /// </summary>
        public Point Coordenada { get; set; }

        /// <summary>
        /// Número que identifica o nó
        /// </summary>
        [System.Xml.Serialization.XmlAttribute]
        public int Id { get; set; }

        /// <summary>
        /// Nome descritivo do nó
        /// </summary>
        [System.Xml.Serialization.XmlAttribute]
        public string Nome { get; set; }

        /// <summary>
        /// Retorna uma representação em string dos valores contidos nesse Cliente para fácil leitura
        /// </summary>
        /// <returns>a seguinte string Id={0},Coord={X={1},Y={2}},D={3} onde {n} são representações conforme a conversão de interos em string do campo descrito antes do sinal de igualdade</returns>
        public override string ToString()
        {
            return string.Format("Id={0},Coord={{{1}}},D={2}", Id, Coordenada, Demanda);
        }

        /// <summary>
        /// Indica se este Cliente é igual a outro
        /// </summary>
        /// <param name="other">Outro cliente a ser comparado</param>
        /// <returns>retorna 'true' se ambos os clientes tiverem mesmos dados, retorna 'false' caso contrário</returns>
        public bool Equals(Cliente other)
        {
            return this.Id == other.Id && this.Coordenada == other.Coordenada && this.Demanda == other.Demanda;
        }
    }
}